#include <iostream>

#include "include/Continent.h"
#include "include/Visitor.h"
#include "include/Territoire.h"

using namespace std;


Continent::Continent(Monde * _monde, const char * _nom)
   : monde(_monde), nom(new char[strlen(_nom)+1])
{
   strcpy(nom, _nom);
}

Continent::~Continent()
{
   //printf("Destruction du Continent %s !\n", nom);
   delete []nom;
   vector<Territoire*>::const_iterator territoires_ite;
   for(territoires_ite = getTerritoires()->begin();
       territoires_ite != getTerritoires()->end();
       territoires_ite++)
      delete *territoires_ite;
}

const char * Continent::getNom() const
{
   return nom;
}

void Continent::accept(Visitor * _visitor)
{
    _visitor->visit(this);
}

Territoire * Continent::addTerritoire(const char * _nom, int _id)
{
   territoires.push_back(new Territoire(this, _nom, _id));
   return territoires.back();
}

Territoire * Continent::getTerritoireByName(const char * _name)
{
   vector<Territoire*>::const_iterator territoires_ite;
   for(territoires_ite = getTerritoires()->begin();
       territoires_ite != getTerritoires()->end();
       territoires_ite++)
   {
      if( strcmp((*territoires_ite)->getNom(), _name) == 0 )
         return *territoires_ite;
   }
   return NULL;
}

bool Continent::appartientAuJoueur(Joueur * _joueur)
{
   vector<Territoire*>::iterator territoires_ite;
   for(territoires_ite = getTerritoires()->begin();
       territoires_ite != getTerritoires()->end();
       territoires_ite++)
   {
      if( ! (*territoires_ite)->appartientAuJoueur(_joueur) )
         return false;
   }
   return true;
}

ostream & operator << (ostream & out, const Continent & _continent) 
{ 
   out << "Continent: " << _continent.getNom() << endl;

   vector<Territoire*>::const_iterator territoires_ite;
   for(territoires_ite = _continent.getTerritoires()->begin();
       territoires_ite != _continent.getTerritoires()->end();
       territoires_ite++)
   {
      out << **territoires_ite << endl;
   }
   
   return out;
}
